package com.atguigu.springcloud.alibaba.service.impl;

import com.atguigu.springcloud.alibaba.dao.OrderMapper;
import com.atguigu.springcloud.alibaba.entity.Order;
import com.atguigu.springcloud.alibaba.service.AccountService;
import com.atguigu.springcloud.alibaba.service.OrderService;
import com.atguigu.springcloud.alibaba.service.StorageService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: cloud2020
 * @description:
 * 1.TM开启分布式事务(TM向TC注册全局事务记录) --->头上标注了@GlobalTransactional的方法,就是TM,是事务的发起者
 *      按业务场景，编排数据库、服务等事务内资源(RM向TC汇报资源准备状态)
 *      TM结束分布式事务，事务一阶段结束(TM通知TC提交/回滚分布式事务)
 * 2.TC汇总事务信息，决定分布式事务是提交还是回滚 --->seata这个框架本身,就是TC,他掌控着全局
 *      TC通知所有RM提交/回滚资源，事务二阶段结束。
 *
 * 3.RM--->每个微服务中被调用的数据库,就是RM,他被TC控制是否回滚与提交,属于事务的参与方
 *
 * @author: YuWenYi
 * @create: 2021-04-19 20:47
 **/
@Service
@Slf4j
public class OrderServiceImpl implements OrderService{

    @Autowired
    StorageService storageService;

    @Autowired
    AccountService accountService;

    @Autowired
    OrderMapper orderMapper;

    /**
     * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
     * 简单说：下订单->扣库存->减余额->改状态
     */
    @Override
    //添加分布式事务管理
    @GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
    //rollbackFor = Exception.class表示对任意异常都进行回滚
    public void saveOrder(Order order) {
        log.info("---->开始新建订单");

        orderMapper.insert(order);

        log.info("---->订单微服务开始调用库存,做扣减count-->"+order.getCount());
        //减少库存
        storageService.decrease(order.getProductId(),order.getCount());

        log.info("---->订单微服务开始调用用户账户,做扣减money--->"+order.getMoney());
        //扣用户的钱
        accountService.decrease(order.getUserId(),order.getMoney());

        log.info("---->修改订单状态开始");
        orderMapper.updateByUserId(order.getUserId(),0);

        log.info("---->订单创建完成");
    }
}
